//
//  CZStatusViewModel.swift
//  微博
//
//  Created by 霸气的刘吉庆 on 16/4/20.
//  Copyright © 2016年 ios. All rights reserved.
//

import UIKit
import SDWebImage
import YYText
import SVProgressHUD
class CZStatusViewModel: NSObject {
    
    //创建model管理
    
    var status: CZStutsModel? {
        
        didSet{
            
            dealMemberImage()
            
            dealWithSource()
            
            //设置转发微博的内容
            
            if let s = status?.retweeted_status {
                //判断内容和名字
                
                if let name = s.user?.name,content = s.text {
                    
                    retweetText = "@\(name):\(content)"
                    retweetAttributedString = self.attributedText(retweetText!)
                    
                }
                
            }
            
            retweetViewSize = calculateRetweetViewSize(status?.retweeted_status?.pic_urls)
            
            originalViewSize = calculateRetweetViewSize(status?.pic_urls)
            
            //处理时间,传入的值可以是可选的类型
            createDate = self.sinaDate(status?.created_at)
            
            originalAttributedString = self.attributedText(status?.text ?? "")
            
        }
    }
    
    //当前微博用户的会员的图标
    
    var memberImage: UIImage?
    
    //定义一个属性,表明转发微博的内容
    
    var retweetText: String?
    
    //定义一个属性,判断来源字符,并进行数据的操作
    
    var sourceText: String?
    
    //转发微博的配图的视图大小,ViewModel里面专门处理数据的,这里的数据是处理过后我们用来记录的
    
    var retweetViewSize: CGSize = CGSizeZero
    //原创微博视图的size
    var originalViewSize: CGSize = CGSizeZero
    
    
    //原创微博的富文本里面的内容
    var originalAttributedString: NSAttributedString?
    var retweetAttributedString: NSAttributedString?

    
    //创建一个对应的方法
    func attributedText(text: String) -> NSAttributedString{
        //首先获取对应的字符串
        
        //获取原生的富文本
        let attributeString = NSMutableAttributedString(string: text)
        
        var results = [CZMatchResult]()
        //1.匹配出表情字符串
        //   \\[ [a-zA-Z0-9\\u2E80-\\u9FFF]+ (这个"+"代表的是可以出现一个或者多个)  \\]
      (text as NSString).enumerateStringsMatchedByRegex("\\[[a-zA-Z0-9\\u2E80-\\u9FFF]+\\]") { (count, captureString, captureRange, _) -> Void in
        print("\(captureString.memory!)-----\(captureRange.memory)")
         //通过表情字符串找到模型
        let result = CZMatchResult(captureString: captureString.memory!, range: captureRange.memory)
        results.append(result)
        
        //原先的方法
        //通过字符串找到模型
//        if let emoticon = CZEmoticonKeyBoardViewModel.sharedViewModel.emoticonWithChs(captureString.memory! as String){
//            //通过表情生成对应的附件
//            let image = UIImage(named: "\(emoticon.folderName ?? "")/\(emoticon.png ?? "")", inBundle: CZEmoticonKeyBoardViewModel.sharedViewModel.emoticonBundle, compatibleWithTraitCollection: nil)
//            let attachment = NSTextAttachment()
//            attachment.image = image
//            let font = UIFont.systemFontOfSize(CZHomeCellContentFontSize)
//            //设置附文件的大小
//            attachment.bounds = CGRect(x: 0, y: -4, width: font.lineHeight, height: font.lineHeight)
//            //初始化一份富文本,把对应的字符串给替换掉
//            let attrString = NSAttributedString(attachment: attachment)
//            attributeString.replaceCharactersInRange(captureRange.memory, withAttributedString: attrString)
        }
        //为了防止数组的越界,我们反序列化进行操作
        for value in results.reverse() {
            //2.通过表情字符串找到对应的表情模型
            if let emoticon = CZEmoticonKeyBoardViewModel.sharedViewModel.emoticonWithChs(value.captureString as String) {
           //3.替换对应的表情字符串
                let image = UIImage(named: "\(emoticon.folderName ?? "")/\(emoticon.png ?? "")", inBundle: CZEmoticonKeyBoardViewModel.sharedViewModel.emoticonBundle, compatibleWithTraitCollection: nil)
                //创建attachment
//                let attachment = NSTextAttachment()
//                attachment.image = image
                let font = UIFont.systemFontOfSize(CZHomeCellContentFontSize)
//                attachment.bounds = CGRect(x: 0, y: -4, width: font.lineHeight, height: font.lineHeight)
                
//                let attr = NSAttributedString(attachment: attachment)
                
                let attr = NSMutableAttributedString.yy_attachmentStringWithContent(image, contentMode: UIViewContentMode.ScaleAspectFill, attachmentSize: CGSize(width: font.lineHeight, height: font.lineHeight), alignToFont: font, alignment: YYTextVerticalAlignment.Center)
                
                //替换
                attributeString.replaceCharactersInRange(value.range, withAttributedString: attr)
            }
            
            
            
            
        }
        //设置字体的颜色,为什么在这里设置呢,首先使用第三方框架,设置字体需要我们自己设置,其次如果在下面设置会覆盖
        attributeString.addAttribute(NSForegroundColorAttributeName, value: UIColor.darkGrayColor(), range: NSMakeRange(0, attributeString.length))
        
        //添加特殊文字的颜色
        //话题
        addLinkColor("#[^#]+#", attributeString: attributeString)
        //@某某某
        addLinkColor("@[\\u4e00-\\u9fa5A-Za-z0-9_\\-]+", attributeString:attributeString)
        //这个是http的地址
        addLinkColor("([hH]ttp[s]{0,1})://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\-~!@#$%^&*+?:_/=<>.',;]*)?", attributeString: attributeString)
        
        //添加字体的大小
        attributeString.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(CZHomeCellContentFontSize), range: NSMakeRange(0, attributeString.length))
        
        
        
        return attributeString
        
        }
       
        
    //添加字符串的颜色.....看见regex就是非正式原则
    func addLinkColor(regex: String,attributeString: NSMutableAttributedString){
        
        //话题 #aasda#
        (attributeString.string as NSString).enumerateStringsMatchedByRegex(regex) { (count, captureString, captureRange, _) -> Void in
            
            
            //注意上面这几个参数里面有几个是指针
            attributeString.addAttribute(NSForegroundColorAttributeName, value:UIColor(red: 80/255, green: 125/255, blue: 175/255, alpha: 1) , range: captureRange.memory)
            
            
            //1.初始化一个背景对象
            
            let border = YYTextBorder(fillColor: UIColor(red: 177/255, green: 215/255, blue: 255/255, alpha: 1), cornerRadius: 3)
            //边框的边距
            border.insets = UIEdgeInsetsZero
            
            //初始化的高亮的对象
            let highlight = YYTextHighlight()
            //设置高亮时候的文字的颜色
            highlight.setColor(UIColor(red: 80/255, green: 125/255, blue: 175/255, alpha: 1))
            //设置高亮时的背景
            highlight.setBackgroundBorder(border)
            let s = captureString.memory! as String
            highlight.tapAction = {(containerView: UIView,text: NSAttributedString,range: NSRange,rect: CGRect)->() in
                print("特殊字符点击了")
                
                SVProgressHUD.showInfoWithStatus(s)
                
                
            }
            //将高亮的状态添加到attributedString里面
            attributeString.yy_setTextHighlight(highlight, range: captureRange.memory)
            
        }
        
        
        
        
    }
        
 
    
    //设置距离当前时间, 微博创建的时间
    var creatAtText: String? {
        
        return dealCreatAtText(createDate ?? NSDate())
    }
    
    //获取时间的方法和思路,
    /*
    
    首先我们将获取得到的字符串转化成NSdate
    其次使用方法与当前时间进行比较,返回对应的字符串
    
    
    
    */
    
    //获取数据里面的时间
    
    //定义一个私有属性,储存我们装换的新浪微博的时间
    private var createDate: NSDate?
    
    private func sinaDate(createAt: String?) -> NSDate?{
        
        //返回值是nil,上面的返回值注意要是可选的类型,不然会报错
        guard let creatTime = createAt else{
            return nil
        }
        
        let formatter = NSDateFormatter()
        formatter.locale = NSLocale(localeIdentifier: "en")
        
        formatter.dateFormat = "EEE MMM dd HH:mm:ss z yyyy"
        
        let creatDate = formatter.dateFromString(creatTime)
        
        print(creatDate)
        
        return creatDate
        
        
        
    }
    
    //进行比对,返回对应的字符串,根据刚刚我们设置的私有的属性,进行比对
   
    private func dealCreatAtText(createDate: NSDate) -> String{
        
        let formatter = NSDateFormatter()
        
        //2015-08-10 10:10:10 yyyy-MM-dd HH:mm:ss
        formatter.locale = NSLocale(localeIdentifier: "en")
        //需要保存那个时区一样,这样才能比对
        //创建日历对象,获取当前的时间
        let calendar = NSCalendar.currentCalendar()
        
        //与当前的时间进行对比,调用方法顺带进行了判断
        
        if isDateInThisYear(createDate) {
            
            
            //尽心判断,是否是当天
            if calendar.isDateInToday(createDate){
                
                let currentDate = NSDate()
                //请求当前的时间的间隔
                let timeInterval = currentDate.timeIntervalSinceDate(createDate)
                
                
                
                //判断是否是今天
                if timeInterval < 60{
                    
                    return "刚刚"
                    
                }else if timeInterval < 3600 {
                    
                    return "\(Int(timeInterval)/60)分钟前"
                    
                }else{
                    
                    return "\(Int(timeInterval)/3600)小时前"
                }
                
                
                
                
                
                
                
                
            }else if calendar.isDateInYesterday(createDate){
                
                formatter.dateFormat = "昨天 HH:mm"
                
                return formatter.stringFromDate(createDate)
                
                
            }else{
                
                //其他
                formatter.dateFormat = "MM-dd HH:mm"
                
                return formatter.stringFromDate(createDate)
                
            }
            
            
            
            
            
            
            
        }else{
            
            
            formatter.dateFormat = "yyyy-MM-dd HH:mm"
            
            
            return formatter.stringFromDate(createDate)
            
            
        }
        
        
        
        
       
        
    }
    
    
    
    //处理时间的方法
//    private func dealCreatAtText(){
//        
//        //获取当前的时间字符串
//        guard let creatTime = status?.created_at else{
//            
//            return
//        }
//        
//        //将字符串转换成NSdate
//        //初始化时间格式化控制器
//        let formatter = NSDateFormatter()
//        //指定格式化字符串    Sun Nov 22 11:25:56 +0800 2015
//
//        // sun 代表星期几 nov 代表的是月份, 22代表几号 然后是时间 区号 年份
//        
//        //设置地区,这样系统会帮我们自动装换成对应的时间区
//        formatter.locale = NSLocale(localeIdentifier: "en")
//        
//        //设置格式字符串 ,与上面的对应起来
//        formatter.dateFormat = "EEE MMM dd HH:mm:ss z yyyy"
//        let createDate = formatter.dateFromString(creatTime)!
//        print(createDate)
//        
//        //获取到了格式化的字符串,可以取值与当前的时间进行对比
//        
//        //与当前时间进行对比
//        if isDateInThisYear(createDate){
//            //createDate 是否是今年
//            creatAtText = "是今年"
//        }else{
//            creatAtText = "不是今年"
//        }
//        
//        
//        
//        
//        
//        
//        
//        
//    }
    //传入一个时间,与当前的时间进行对比,返回是否是当前时间的年份
    private func isDateInThisYear(targetDate: NSDate) -> Bool {
        //获取当期的时间
        let currentTime = NSDate()
        //获取格式化控制器
        let formatter = NSDateFormatter()
        //根据格式化控制器获取响应的年份
        formatter.dateFormat = "yyyy"
        
        let creatYear = formatter.stringFromDate(targetDate)
        let currentYear = formatter.stringFromDate(currentTime)
        
        return creatYear == currentYear
        
        
        
    }
    
    
    func upDateSingleImagePictureView(){
        //计算单个图片,传进去一个数组,因为是单个,经过判断调用此方法,所以里面必定只有一个元素
        //上面的一个方法虽然也是传入进去一个数组,但是他是根据里面有多少个元素来计算view的大小
        retweetViewSize = calculateSingleImageSize(status?.retweeted_status?.pic_urls)
        
        originalViewSize = calculateSingleImageSize(status?.pic_urls)
        
        
    }
    
    //计算单图的大小,
    private func calculateSingleImageSize(pic_urls: [CZPictureModel]?)->CGSize{
        
        //取出图片的地址
        guard let imageUrlString = pic_urls?.first?.thumbnail_pic else{
            return CGSizeZero
        }
        //根据图片地址取到下载好的图片(从缓存里面取)
        
        if let image = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(imageUrlString){
            
//            print(SDWebImageManager.sharedManager().imageCache.)
            
            //SDWebImage 下载图片保存的时候,会对当前的图片进行缩放
            //想要正确的显示,就把他缩放回来
            
            let scale = UIScreen.mainScreen().scale
            
            var size = CGSizeMake(image.size.width*scale, image.size.height * scale)
            
            //过窄处理
            //如果宽度小于50就把他拉伸到50,高度等比例拉伸
            
            if size.width < 50 {
                
                let height = 50/size.width * size.height
                
                size.width = 50
                
                size.height = height > 100 ? 100 : height
                
                
            }
            
            return size
            
            
            
        }
        
        
        return CGSizeZero
        
        
    }
    
    //通过一个视图的数据计算他的size的大小,这里为什么传入一个?有些疑问
    private func calculateRetweetViewSize(pic_urls: [CZPictureModel]?)->CGSize{
        //根据这个整个数据,其实就是collectionView的数据源(数组)
        //获取图片的个数
        let count = pic_urls?.count ?? 0
        //判断如果是0张,返回0
        if count == 0 {
            return CGSizeZero
        }
        //来到这里代表里面有值,开始计算
        let col = (count == 4) ? 2 : (count > 3 ? 3 : count)
        //例子: 5->(4/3)+1=2,代表2行,实际的操作中必须根据实际情况发现相应的规律
        let row = (count-1)/3 + 1
        
        //2.求出每一张图片的带下,并且设置他的间距
        //设置间距
        let margin: CGFloat = 5
        //计算每一个cell的宽高,这里设置他们相等
        let itemWH = (SCREENW - 2 * CZHomeCellMargin - 2 * margin)/3
    
        //计算配图视图的大小
        //不同类型不能转换
        let ViewW = CGFloat(col) * itemWH + CGFloat(col-1) * margin
        let ViewH = CGFloat(row) * itemWH + CGFloat(row-1) * margin
    
       print(CGSizeMake(ViewW, ViewH))
        return CGSizeMake(ViewW, ViewH)
    }
    private func dealWithSource(){
        
        
        guard let s = status?.source else {
            return
        }
        // <a href=\"http://app.weibo.com/t/feed/5B6hUc\" rel=\"nofollow\">iPhone 6s Plus</a>
        //开始截取的位置
        
        
        //这个的出来的是可选值
//        let startIndex = s.rangeOfString("\">")?.endIndex
////
//        let endIndex = s.rangeOfString("</")?.startIndex
        
        //开始截取
        
        if let  startIndex = s.rangeOfString("\">")?.endIndex, endIndex = s.rangeOfString("</")?.startIndex {
            
           
            let result = s.substringWithRange(startIndex..<endIndex)
            
            sourceText = "来自\(result)"
            
            
            
            
        }
        
        
    }
    
    
    
    private func dealMemberImage(){
        
        //会员等级1-6
        
//        guard let rank = status?.user?.mbrank else{
//            //这个是为了防止
//            memberImage = nil
//            return
//        }
//        
//        if rank > 0 && rank < 7 {
//            memberImage = UIImage(named: "common_icon_membership_level\(rank)")
//        }
        
        //上面的方法的总结
        if let rank = status?.user?.mbrank where (rank > 0 && rank < 7) {
            
            memberImage = UIImage(named: "common_icon_membership_level\(rank)")
        }
        
        
    }

}
